/**
 * Notes: 资讯实体
 * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat)
 * Date: 2020-10-28 19:20:00 
 */

const BaseProjectModel = require('./base_project_model.js');

class NewsModel extends BaseProjectModel {

	constructor() {
		super();

		this.TABLE = 'news';

		// 字段定义
		this.DB_STRUCTURE = {
			NEWS_ID: 'string|true',
			NEWS_TITLE: 'string|true|comment=标题', 
			NEWS_DESC: 'string|false|comment=简介',
			NEWS_CATE_ID: 'string|true|default=0|comment=分类编号',
			NEWS_CATE_NAME: 'string|true|comment=分类名',
			NEWS_AUTHOR: 'string|false|comment=作者',
			NEWS_CONTENT: 'array|true|default=[]|comment=内容',
			NEWS_PIC: 'array|false|default=[]|comment=图片',
			NEWS_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=启用',
			NEWS_ORDER: 'int|true|default=9999',

			NEWS_VIEW_CNT: 'int|true|default=0',
			NEWS_FAV_CNT: 'int|true|default=0',
			NEWS_COMMENT_CNT: 'int|true|default=0',
			NEWS_ADD_TIME: 'int|true',
			NEWS_EDIT_TIME: 'int|true',
		};

		// 字段前缀
		this.FIELD_PREFIX = "NEWS_";
	}

	/**
	 * 获取分类下的所有资讯
	 * @param {string} cateId 分类ID
	 * @returns 资讯列表
	 */
	async getNewsByCateId(cateId) {
		return await this.getAll({
			NEWS_CATE_ID: cateId,
			NEWS_STATUS: 1
		}, 'NEWS_ORDER asc,NEWS_ADD_TIME desc');
	}

	/**
	 * 创建索引
	 * @param {Object} indexObj 索引对象
	 */
	async createIndex(indexObj) {
		try {
			await this.getCollection().createIndex(indexObj);
		} catch (error) {
			console.error('创建索引失败:', error);
			return null;
		}
	}

	/**
	 * 计算符合条件的记录数量
	 * @param {*} where 查询条件
	 * @returns 记录数量
	 */
	async count(where) {
		return (await this.getCollection().where(where).count()).total;
	}
}

/**
 * 静态方法 - 获取单条记录
 * @param {*} where 查询条件
 * @param {*} fields 字段
 * @param {*} orderBy 排序
 * @returns 单条记录
 */
NewsModel.getOne = async function(where, fields = '*', orderBy = {}) {
	try {
		const instance = new NewsModel();
		return await instance.getOne(where, fields, orderBy);
	} catch (err) {
		console.error('获取资讯记录失败', err);
		return null;
	}
};

/**
 * 静态方法 - 获取列表
 * @param {*} where 查询条件
 * @param {*} fields 字段
 * @param {*} orderBy 排序
 * @param {*} page 页码
 * @param {*} size 分页大小
 * @param {*} isTotal 是否计算总数
 * @param {*} oldTotal 旧总数
 * @returns 列表结果
 */
NewsModel.getList = async function(where, fields = '*', orderBy = {}, page = 1,
size = 10, isTotal = true, oldTotal = 0) {
	try {
		const instance = new NewsModel();
		return await instance.getList(where, fields, orderBy, page, size, isTotal, oldTotal);
	} catch (err) {
		console.error('获取资讯列表失败', err);
		return { total: 0, list: [] };
	}
};

/**
 * 静态方法 - 插入数据
 * @param {*} data 数据
 * @returns 插入结果
 */
NewsModel.insert = async function(data) {
	try {
		const instance = new NewsModel();
		return await instance.insert(data);
	} catch (err) {
		console.error('插入资讯记录失败', err);
		return null;
	}
};

/**
 * 静态方法 - 计数
 * @param {*} where 条件
 * @returns 计数结果
 */
NewsModel.count = async function(where = {}) {
	try {
		const instance = new NewsModel();
		return await instance.count(where);
	} catch (err) {
		console.error('计算资讯数量失败', err);
		return 0;
	}
};

module.exports = NewsModel;